*******************************************************************************
*                           W A R N U N G                                     *
*                                                                             *
* M2LIB ist nichts fr Anfnger! Auf jeden Fall sollte man sich mit dem       *
* verwendeten Modula-System auskennen bzw. in der Lage sein, aus dem Handbuch *
* die ntigen Informationen herauszulesen.                                    *
* Weiterhin sollte man sich einigermaen mit Kommandozeileninterpretern       *
* auskennen (und einen besitzen), da die Quelltexte vor dem eigentlichen      *
* bersetzen noch mit einem Prprozessor bearbeitet werden mssen!            *
*******************************************************************************


Dokumentation
=============

Die Dokumentation besteht aus folgenden Textdateien:

     CHANGES: Die nderungen gegenber dem jeweils letzten Release von M2LIB
              und die nderungen der POSIX-Bibliothek von M2LIB gegenber
              dem letzten Release von M2POSIX (M2POSX17.ZOO).

 CHANGES.OLD: Die nderungen aller verffentlichten M2POSIX-Versionen.
              Ist nur wichtig fr Leute, die von einer alten M2POSIX-Version
              auf M2LIB umsteigen wollen.

     COPYING: Bestimmungen, unter denen M2LIB benutzt und weitergegeben
              werden darf.

   M2LIB.TXT: Dieser Text.

 INSTALL.TXT: Hier stehen die allgemeinen Hinweise fr das Bearbeiten der
              Quelltexte mit dem Prprozessor.

COMPILER.TXT: Hier werden alle compilerspezifischen Dinge beschrieben. Das
              betrifft die Installation, das Verhalten bestimmter Funktionen,
              Bugs und zustzlich vorhandene Dateien.

   POSIX.TXT: Beschreibung der Module aus dem POSIX-Verzeichnis. Sollte
              vor Benutzung der Module gelesen werden.

    MISC.TXT: Beschreibung der Module aus dem MISC-Verzeichnis. Sollte
              vor Benutzung derselben gelesen werden.

 ISO_LIB.TXT: Beschreibung der Module aus dem ISO-Verzeichnis. Sollte
              vor Benutzung derselben gelesen werden.

  ISO_M2.TXT: Beschreibung einiger ISO-nderungen/Erweiterungen gegenber
              dem blichen (Wirth)Sprachstandard. Sollte vor Benutzung der
              ISO-Module gelesen werden.

MATH_IMP.TXT: Einige Details der fr die Implementierung der mathematischen
              Routinen benutzten Approximationsfunktionen.
              Das ist nur fr Interessierte.

MAGICLIB.TXT: Informationen fr Leute, die zustzlich die MagicLib 4.x
              benutzen.

 THREADS.TXT: Wichtige Informationen ber den Umgang mit Prozessen bzw.
              Threads (Programmterminierung, Speicherverwaltung, ...).

     FPU.TXT: Einige Hinweise fr Besitzer einer FPU (z.B. im TT)


Nach diesem Text sollte zunchst INSTALL.TXT und dann COMPILER.TXT gelesen
werden. Danach kann man die anderen Dateien lesen. Auf MATH_IMP.TXT und
vor allem CHANGES.OLD kann man auch verzichten.

In den Dateien POSIX.TXT, ISO_LIB.TXT und MISC.TXT ist zunchst eine
allgemeine Beschreibung der existierenden Module enthalten, whrend die
mehr oder weniger genaue Beschreibung der einzelnen Funktionen in den
Definitionsmodulen enthalten ist. Noch genauer kann (und mu) man sich dann
in den Implementationsmodulen informieren.

Wer eine der "*fork()"-Routinen oder Signale benutzen will, sollte sich
THREADS.TXT durchlesen.

Ich wei -- das Lesen von Dokumentationen ist nicht jedermanns Sache,
allerdings handelt es sich bei M2LIB nicht um ein fertiges Programm, das
man einfach nur zu starten braucht, sondern um ein Hilfsmittel fr
Programmierer; insofern mu sich der Benutzer sowieso intensiver mit der
Beschreibung auseinandersetzen. Bestimmt lassen sich viele Fragen durch
aufmerksames Lesen der vorhandenen Dokumentation beantworten! Ansonsten
gilt die Warnung am Anfang dieser Datei!



Was ist M2LIB?
==============

Wie schon der Name sagt, handelt es sich bei M2LIB um eine Funktions-
bibliothek fr die Programmiersprache Modula-2. Die Zusammenstellung
der Funktionen ist jedoch nicht zufllig, vielmehr existieren drei groe
Untergruppen: Eine POSIX-Bibliothek, eine M2-ISO-Bibliothek und ein paar
weitere Module mit unterschiedlichem Inhalt. Zustzlich gibt es mehrere
Utilities fr die Modula-Systeme LPR und TDI. Die Bibliotheken liegen im
Quelltext vor und sind fr alle gngigen Modula-Systeme geeignet; genauer
gesagt werden die folgenden Systeme untersttzt:

- LPR-Modula, Version 1.4
- SPC-Modula, Version 2.0
- Hnisch-Modula, Version 5.20, Jan.'95
- Megamax-Modula, Version 4.3e
- TDI-Modula, Version 3.01a

Die Versionsnummern beziehen sich auf die Compiler der Systeme, die mir zur
Verfgung stehen. Ich verwende in der gesamten Dokumentation die Begriffe
(Modula-)System und Compiler synonym. Bei Hnisch und Megamax sind auch
andere (ltere) Versionen im Umlauf, da diese beiden Systeme in den
vergangenen Jahren noch weiterentwickelt wurden. Es ist durchaus mglich,
da andere Versionen nicht funktionieren! I.allg. drfte das aber nur ganz
alte Versionen betreffen, so da es nicht zu Problemen kommen sollte;
ansonsten kann ich nur empfehlen: Updaten!
Leider sieht es so aus, als ob inzwischen keines der genannten Systeme
mehr weiterentwickelt wird.

POSIX und ISO(-M2) sind natrlich beides keine Atari-spezifischen Standards,
eher das Gegenteil. Bei Benutzung dieser Bibliotheken sind die Chancen,
ein Programm auch auf andere Systeme zu portieren, dann auch erheblich grer
als bei Verwendung z.B. der GEMDOS-Dateifunktionen.

Damit ein Quelltext fr alle Systeme ausreicht, war es erforderlich, diesen
sozusagen in einer bergeordneten Programmiersprache zu schreiben. Das
hrt sich jetzt allerdings schlimmer an als es ist; diese ``hhere''
Programmiersprache besteht aus Modula-Code, der an einigen Stellen (nmlich
da, wo sich die einzelnen Modula-Systeme unterscheiden) mit Makros erweitert
wurde. Um diese Makros auf den systemspezifischen Modula-Code abzubilden,
mssen die Quelltexte noch mit einem Prprozessor ``bersetzt'' werden,
bevor der eigentliche bersetzungsvorgang mit dem Modula-Compiler stattfinden
kann. Der Prprozessor wird mitgeliefert, erforderlich ist jedoch noch ein
Kommandointerpreter, mit dessen Hilfe das Prprozessieren automatisiert wird.
Es sind Shell-Scripts (Batch-Dateien) fr einige Kommandointerpreter
vorhanden; eine gute Wahl wre z.B. die Mupfel der aktuellen Gemini-
Distribution, es geht allerdings auch mit aktuellen Versionen von Ksh oder
Bash, die beide nur unter MiNT/MultiTOS laufen, oder der alten Gulm, die
sicher noch von einigen benutzt wird.

Nheres zum Prprozessor steht weiter unten und das Prprozessieren mit
dem Kommandointerpreter ist in INSTALL.TXT beschrieben.

Wer mit dem Prprozessor gar nicht zurecht kommt, kann mir auch eine
leere Diskette (DD oder HD) im selbstadressierten und frankierten
Rckumschlag schicken, auf die ich dann die fr das gewnschte M2-System
prprozessierten Quelltexte kopiere. Pro System ist ungefhr eine
(komprimierte) DD-Diskette erforderlich.

Die Nutzungsbedingungen fr M2LIB sind in COPYING erlutert, ich mchte
aber hier nochmal ausdrcklich darauf hinweisen, da ich bei Benutzung
eine Rckmeldung haben mchte, damit ich wei, ob Interesse an dieser
Bibliothek besteht. Ob das nun 'ne einfache Postkarte oder ein ausfhrlicher
Brief, mglicherweise mit nderungsvorschlgen, Bug-Reports usw. wird, ist
mir egal. Wer allerdings eine Antwort haben mchte, sollte Rckporto
beilegen!


Die POSIX-Module
----------------
Die POSIX-Module gab es zuvor bereits seit ca. Anfang '93 als eigenstndige
Bibliothek im Archiv M2POSIX??.ZOO. Whrend dieser Zeit habe ich mich selbst
erst mal sowohl mit dem Konzept der portablen Prprozessor-Quelltexte als
auch mit den UNIX-Systembefehlen beschftigt, wodurch die POSIX-Bibliothek
fters grere nderungen erfahren hat, bis sie auf dem jetzigen Stand
war, der ziemlich stabil sein drfte.

Vom Modula-Normungskomitee gibt es ebenfalls Anstze eine POSIX-Schnittstelle
fr Modula-2 zu entwerfen (ebenso wie eine objektorientierte Erweiterung
der Sprache -- Oberon lt gren), die vorliegende Bibliothek ist jedoch
vllig unabhngig davon ein Eigenentwurf, der auch durch Diskussionen mit
anderen Leuten ``gereift'' ist. Sollte einmal eine Schnittstelle fr Modula-2
vorliegen, und sollte ich diese auch in die Finger kriegen, besteht die
Mglichkeit, da die POSIX-Bibliothek entsprechend umgearbeitet wird. Bis
dahin soll jedoch die vorliegende Implementierung eine mglichst
``C''-nahe Programmierung erleichtern. Damit lassen sich z.B. Quelltexte,
die fr UNIX-Systeme geschrieben wurden, leichter auf den Atari (und nach
Modula) bertragen, oder man kann sich schon mal auf dem Atari mit der
UNIX-Programmierung etwas anfreunden, falls einmal das Betriebssystem
gewechselt werden sollte...

In POSIX.TXT befindet sich eine genauere Beschreibung der Module, die
folgenden Punkte sollen nur einige Features hervorheben:

o Fast alle POSIX-Systemaufrufe sind implementiert. Daneben gibt es
  eine ganze Reihe weiterer gebruchlicher UNIX- und ANSI-C-Funktionen.

o Die Lnge von Dateinamen ist nicht beschrnkt. Es knnen also auch
  Dateinamen mit 1000 Zeichen verarbeitet werden, wobei aber kein
  Platz bei kleineren Lngen verschwendet wird.

o Dateinamen knnen weitgehend nach UNIX-Konvention angegeben werden,
  wobei intern gegebenenfalls eine Umsetzung (z.B. '/bin' -> 'c:\bin')
  stattfindet.

o Die Funktionen machen von den neuen GEMDOS-Funktionen, die von
  MiNT eingefhrt wurden, Gebrauch, sind aber weitgehend unabhngig
  von der MiNT-Existenz.

o Soweit mglich, werden Features, die von der Existenz der neuen
  GEMDOS-Funktionen abhngen, unter ``normalem'' TOS emuliert.


Sicherheitshalber sollte ich wohl noch darauf hinweisen, da UNIX(tm) ein
geschtztes Warenzeichen ist (glaub' ich jedenfalls), und das ich darunter
auch alle hnlichen Systeme verstehe (SunOS(tm) usw.)...


Die ISO-Module
--------------
Nach mehreren Jahren (meiner Meinung nach mindestens fnf Jahre zu spt...)
gibt es nun endlich einen Standard fr Modula-2 (IS 10514). Das Interessante
daran ist, da meines Wissens nach zum ersten Mal auch die Semantik einer
Programmiersprache formal definiert wurde. Ein wesentlicher Bestandteil der
Normung ist die neue (Standard)Bibliothek. Diese ist recht ausfhrlich in
Form von Definitionsmodulen, erklrenden Texten und der formalen semantischen
Definition beschrieben. Den grten Teil dieser Bibliothek macht, wer htte
es gedacht, die Ein/Ausgabe aus. Dabei hat man sich nicht auf Bekanntes
gesttzt, wie z.B. die recht drftige Wirth-Bibliothek, sondern einen
vllig neuen Entwurf vorgelegt. Das hat den Nachteil, da sich die
Brauchbarkeit des verwendeten Ansatzes noch nicht in der Praxis erwiesen
hat, andererseits konnte so aber ein stimmiges Konzept erarbeitet werden,
das nicht wegen der Rcksichtnahme auf Kompatibilitt zu Vorhandenem
in der Leistung beschrnkt ist. ber die Brauchbarkeit der ISO-Ein/Ausgabe
kann man sicherlich geteilter Meinung sein, ich persnlich finde das
Konzept jedoch, bis auf einen Punkt, sehr gut. Dieser eine Punkt ist die
Art der Fehlerbehandlung, die sich voll auf die in ISO-Modula neu
hinzugekommenen Ausnahmen (Exceptions) sttzt. Nheres dazu steht in
ISO_LIB.TXT und ISO_M2.TXT.

Mit der Definition einer Standardbibliothek sollte es nun mglich sein,
ebenso wie in C, portable Quelltexte zu produzieren, die sich mit nur
wenigen nderungen auf verschiedene Compilern und Betriebssysteme
bertragen lassen. Na ja, das ist vielleicht etwas zu hoch gegriffen,
aber die Benutzung einer einheitlichen Schnittstelle, zumindest bei
den Grundfunktionen, mte die Sache doch stark vereinfachen.

Die vorliegende Implementierung der ISO-Bibliothek enthlt fast alle im
Standard vorhandenen Module, so z.B. auch die mathematischen Module fr
komplexe Zahlen. Im Gegensatz zur POSIX-Bibliothek haben die Module jedoch
keine lange Testphase hinter sich, so da sich bei stndiger Benutzung
sicherlich noch einige Fehler bemerkbar machen werden; vor allem die
Ein/Ausgabe drfte ein guter Kandidat fr Fehler sein. Die Fehler knnen
aber nur beseitigt werden, wenn sie auch bekannt sind, deshalb sollte man
mir Fehler mitteilen und nicht darauf hoffen, da ich sie schon selbst finde!

ISO_LIB.TXT enthlt eine relativ ausfhrliche Beschreibung aller Module
und in den Definitionsmodulen ist auch noch mal viel Information enthalten.
Von den nicht implementierten Modulen ist jeweils das Definitionsmodul
vorhanden, so da alle Module des neuen Standards dokumentiert sind.


Die sonstigen Module in MISC
----------------------------
Vor einigen Jahren gab es von mir mal eine Bibliothek fr LPR-Modula
namens HK_LIB (ST-Computer PD #334). Die dort enthaltenen Module
sollen mit der Zeit in M2LIB aufgenommen werden, wobei sie dann natrlich
ebenso wie die anderen Bibliotheken portabel fr alle untersttzten
Compiler sein sollen. Viele der in HK_LIB enthaltenen Module sind
bereits durch Module der ISO- oder POSIX-Bibliothek berflssig geworden,
ein paar andere liegen schon gendert vor.

Ansonsten kommen hier die Module rein, die weder POSIX noch ISO
zuzuordnen sind.


Utilities fr LPR-Modula
------------------------
Angefangen mit der oben erwhnten HK_LIB habe ich einige Korrekturen
und Erweiterungen fr das LPR-Systems gebastelt. Diese wurden zuletzt als
eigenstndiges Archiv LPR_UTL?.ZOO verteilt.

Zu dieser losen Sammlung gehren:

o Patches fr die (LONG)REAL-Arithmetik.

o Patches fr die Programmierung von ACCs und eine Modulterminierung.

o Ein korrigiertes 'Heap'-Modul, das das Originalmodul im LPR-Verzeichnis
  STANDALO.NE fr gelinkte Programme ersetzt.

o Dokumentation einiger Aspekte des LPR-Systems, insbesondere des Compilers.

o Ein kleines Programm, mit dem sich Objektdateien analysieren lassen.

o Ein paar nach Modula rckkompilierte LPR-Modula.

Die Patches und Korrekturen sollte man unbedingt vornehmen, da sonst einiges
nicht (korrekt) funktioniert!

Diese Sammlung ist als Zugabe zu verstehen; genauere Erklrungen der
einzelnen Dinge sind entweder in einer entsprechenden Textdatei oder einfach
nicht vorhanden...


Utilities fr TDI-Modula
------------------------
Diese Dateien wurden von Rolf Schrader beigesteuert. Es handelt sich dabei
um folgende Dinge:

o Ein (umfangreicher) Bugreport mit einigen Demonstrationsprogrammen.

o Einige Patches, die von Hand vorgenommen werden knnen/mssen.

o Einige Programme fr oder mit TDI-Modula.

Ein vollstndiges Archiv dieser Utilities ist auch per anonymous ftp
erhltlich:

    ftp://ftp.cs.tu-berlin.de/pub/atari/Programming/Modula-2/tdi-utl?.lzh


Was M2LIB nicht bietet
======================

Eine GEM-Bibliothek. Das ist auch unntig, da es sowas bereits gibt:
``crystal'' von Ulrich Kaiser. Diese Bibliothek bietet ebenfalls
Quelltexte mit Prprozessorkommandos, wobei sogar PC-GEM bercksichtigt
wird. crystal ist in einem Archiv m2gem???.lzh enthalten und sollte
ebenfalls dort zu finden sein, wo es M2LIB gibt, also z.B. per
anonymous ftp auf

    ftp://ftp.cs.tu-berlin.de/pub/atari/Programming/Modula-2/m2gem*



Warum ein Prprozessor?
=======================

Leider verstehen nicht alle Modula-2-Compiler einen gemeinsamen
``Dialekt''. Sicher -- die Sprache ist in einer Sprachbeschreibung
definiert worden, aber zum einen gibt es mehrere Versionen dieser
Beschreibung (PIM1..PIM4), zum anderen ist lediglich die Syntax formal
definiert (EBNF), die Semantik aber in Form natrlichsprachlicher
Texte, so da viele Dinge nicht eindeutig festgelegt sind (werden
knnen). Auerdem haben die Compiler-Hersteller auch eigene
Restriktionen und/oder Erweiterungen hinzugefgt. Diese Situation wird
sich erst ndern, wenn sich die Hersteller an die ISO-Norm fr
Modula-2 halten (wird auf dem Atari wohl nicht mehr passieren...), hier
wird nmlich auch die Semantik bis ins kleinste formal definiert.

Um diese Unterschiede mglichst aus dem Weg zu rumen, werden die
Module mit Prprozessormakros versehen, die z.T. von der Syntax her
wie ISO-M2-Code aussehen (z.B. CAST, VAL, ADDADR, SUBADR, DIFADR, INT
usw.). In der Datei PORTAB.M2H, die die Definitionen enthlt, werden
die Makros dann auf die compilerspezifischen Konstruktionen
abgebildet. Eine weitere Datei mit Makros ist OSCALLS.M2H; sie enthlt
die Definitionen fr die Aufrufe der Betriebssystemfunktionen.

Beispiele fr Makrodefinitionen sind (aus PORTAB.M2H):

  #define ISO_underscore \
  ((defined ISOM2) || (defined MM2) || (defined HM2))

Das Makro ISO_underscore wird hierbei mit dem Wert Eins definiert, wenn
es sich um einen ISO-Compiler, den Megamax- oder den Hnisch-Compiler
handelt, sonst mit dem Wert Null.

Damit wird dann z.B. folgendes mglich:

  #if ISO_underscore
  CONST Identifier = _full_name;
  #else
  CONST Identifier = FullName;
  #endif


Ein anderes Makro wre:

  #if (defined LPRM2)
  #  define NEW(_PTR) ALLOCATE(_PTR,SIZE(_PTR ## ^))
  #  define DISPOSE(_PTR) DEALLOCATE(_PTR,SIZE(_PTR ## ^))
  #endif

Ein Aufruf der Standardfunktion NEW, die beim LPR-System nicht vorhanden
ist, wird durch die explizite Verwendung von ALLOCATE ersetzt, d.h.

  NEW(PtrToRec);

wird zu

  ALLOCATE(PtrToRec,SIZE(PtrToRec^));

Und bei Systemen, die NEW zur Verfgung stellen, wird durch den Prprozessor
nichts verndert, da es sich dann nicht um ein Makro handelt.

Wer nheres ber den Prprozessor erfahren mchte, kann sich die in CPP.DVI
enthaltene Dokumentation durchlesen, wofr dann ein DVI-Previewer und
die entsprechenden TeX-Zeichenstze fr den Bildschirm bentigt werden.

Durch das Konzept der Makros knnen die Module also einheitlich fr
unterschiedliche Compiler programmiert werden; die Unterschiede werden
dann erst beim Bearbeiten mit dem Prprozessor bercksichtigt, das am
besten als erster Pass des bersetzungsvorganges angesehen wird. (Bei
``C''-Compilern ist dieses Vorgehen ja bereits integriert, es hindert
einen aber niemand daran, dies auch fr andere Sprachen, wie Modula-2,
zu benutzen.)

Um Module mit und ohne Makros leicht auseinanderhalten zu knnen, verwende
ich folgende Extensionen fr Modula-Dateien mit Prprozessorkommandos:

  .DPP    fr Definitionsmodule,
  .IPP    fr Implementationsmodule und
  .MPP    fr Programmodule

Diese Kennzeichnung ist natrlich nur ein Vorschlag.


Um Arbeit zu sparen, wird ein existierender Prprozessor verwendet, der
normalerweise fr den GNU-C-Compiler (gcc) Verwendung findet. Das hat den
Vorteil, da der Prprozessor frei verfgbar und auerdem sehr leistungsfhig
ist.

Allerdings hat die Benutzung eines C-Prprozessors auch Nachteile:

o Die Modula-2-Kommentarklammern sind keine C-Kommentarklammern --
  deshalb werden Zeichenketten, die mit definierten Makros
  bereinstimmen, auch innerhalb von Modula-2-Kommentaren durch den
  Prprozessor ersetzt. Als Behelf kann man die entsprechenden
  Schlsselworte innerhalb der Modula-2-Kommentare in doppelte
  Anfhrungszeichen (") setzen, da der Prprozessor, zumindest der
  GNU-C-Prprozessor, keine Makros in C-Strings ersetzt.

  Weiterhin bereiten auch einzelne Apostrophs in Kommentaren
  Schwierigkeiten: nach einem Apostroph erwartet der Prprozessor
  nmlich eine Zeichenkonstante samt abschlieendem Apostroph in
  derselben Zeile.

o Der Backslash '\' hat fr den Prprozessor eine Spezialbedeutung: je
  nach dem (oder den) nachfolgenden Zeichen wird fr die Kombination
  der Zeichen nachher durch den Compiler ein Spezial-(meistens
  Control) Zeichen eingesetzt. Obwohl nicht der Prprozessor fr die
  Ersetzung verantwortlich ist, meldet er jedoch einen Fehler (->
  "unterminated string constant"), wenn hinter dem Backslash in einer
  Zeichen- oder Stringkonstante kein Zeichen mehr folgt (Das gilt
  zumindest fr den GNU-C-Prprozessor). Damit ist es z.B. nicht
  mglich, eine Stringkonstante mit einem Backslash enden zu lassen
  oder '\' als Zeichenkonstante zu vereinbaren:

    CONST PathSep = '\';

  Stattdessen verwendet man den oktalen ASCII-Code:

    CONST PathSep = 134C;

o Bei der Makroexpansion wird die syntaktische Struktur der Argumente
  nicht beachtet, sondern es gilt alles als Parameter, was entweder
  durch ein Komma oder die ueren Klammern begrenzt ist. Da auerdem
  Makros eine festgelegte Anzahl von Parametern haben, kommt es zu Problemen.

  Beispiel:

    #define INT(expr) VAL(INTEGER,expr)

  Mit dieser Definition wird beispielsweise INT(feld[0]) zu
  VAL(INTEGER,feld[0]) expandiert. Folgende Konstruktion geht jedoch
  nicht: INT(feld[0,0]), denn der Prprozessor betrachtet dies als einen
  Makroaufruf mit zwei Argumenten -- 'feld[0' und '0]' --, whrend die
  Definition von INT nur ein Argument vorsieht.

  Der GNU-Prprozessor besitzt ein undokumentiertes Feature (d.h. es wird
  nicht in der Dokumentation erwhnt und kann sich jederzeit ndern), das es
  dem letzten Makroparameter erlaubt, alle noch folgenden Argumente als
  ein einzelnes Argument zu betrachten.

  Beispiel:

    #define INT(expr...) VAL(INTEGER,expr)

  Dann wird INT(feld[0,0]) zu VAL(INTEGER,feld[0,0]), wobei 'feld[0,0]' als
  ein Argument gilt, obwohl ein Komma enthalten ist.


  Aus dem Quelltext (cccp.c):

/*
 * special extension string that can be added to the last macro argument to
 * allow it to absorb the "rest" of the arguments when expanded.  Ex:
 *              #define wow(a, b...)            process (b, a, b)
 *              { wow (1, 2, 3); }      ->      { process (2, 3, 1, 2, 3); }
 *              { wow (one, two); }     ->      { process (two, one, two); }
 * if this "rest_arg" is used with the concat token '##' and if it is not
 * supplied then the token attached to with ## will not be outputted.  Ex:
 *              #define wow (a, b...)           process (b ## , a, ## b)
 *              { wow (1, 2); }         ->      { process (2, 1, 2); }
 *              { wow (one); }          ->      { process (one); }
 */
static char rest_extension[] = "...";


Bezugsquellen
=============

M2LIB sollte auf einigen ftp-Servern vorhanden sein, z.B.:

  ftp://ftp.cs.tu-berlin.de/pub/atari/Programming/Modula-2/m2lib*

Auerdem gibt es sie noch auf den ST-Computer-PD-Disketten 782 & 783
(bis M2LIB-3; ob auch M2LIB-4 auf diesen Disketten enthalten sein wird,
wei ich nicht).


Danksagungen
============

Folgende Personen haben auf die eine oder andere Weise etwas zu M2LIB
beigetragen -- vielen Dank! (alphabetisch):

Andreas Alich
Ulrich Kaiser
Bertram Kirsch
Martin Wilhelm Leidig
Pieter van Middelen
Olaf Orth
Rolf Schrader
Thomas Tempelmann


Meine Adresse
=============

Holger Kleinschmidt
Promenadenstr. 11 B
D-12207 Berlin

email: holgerkl@cs.tu-berlin.de
